package com.lijing.DoubleLinkedList;

import edu.princeton.cs.algs4.StdOut;

public class DoubleLinkedList {
    private HeroNode head = new HeroNode(0,"","");

    public HeroNode getHead() {
        return head;
    }

    //添加节点到双向链表
    public void add(HeroNode newHero){
        HeroNode temp = head;
        while (temp.next != null){//temp.next为空时即遍历到了最后一个节点
            temp = temp.next;
        }
        temp.next = newHero;
        newHero.pre = temp;
    }

    public void addByOrder(HeroNode newHero){
        //链表非空，根据no来添加,temp直接指向前一个节点
        HeroNode temp = head;
        boolean flag = false;
        while(true){
            if (temp.next == null){//链表为空
                break;
            }
            if(temp.next.no == newHero.no){//要添加的节点的no已经存在
                flag = true;
                break;
            }else if(temp.next.no > newHero.no){//找到第一个节点no比newHero的no大，加在它前面即加载temp.next前面
                break;
            }

            temp = temp.next;
        }
        if (!flag){
            if (temp.next != null){//添加在链表中
                newHero.next = temp.next;
                newHero.pre = temp;
                temp.next = newHero;
                temp.next.pre = newHero;
            }else {//添加到链表尾部
                temp.next = newHero;
                newHero.pre = temp;
            }

        }else{
            System.out.printf("要添加的no为%d的节点已存在", newHero.no);
        }
    }

    //更新节点
    public void update(HeroNode newHeroNode){
        //判断是否为空
        if (head.next == null){
            System.out.println("链表为空！");
            return;
        }
        HeroNode temp = head.next;
        boolean flag = false;//用于标志有没有可修改的数据，即有没有该no的节点
        while (true){
            if (temp == null){//链表已经遍历完成,直接退出
                break;
            }
            if(temp.no == newHeroNode.no){//找到需要修改更新的节点
                flag = true;//表示找到
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = newHeroNode.name;
            temp.nickName = newHeroNode.nickName;
        }else {
            System.out.printf("没有找到编号为%d的节点，不能修改\n", newHeroNode.no);
        }
    }

    //删除节点，根据no来删除
    public void del(int no){
        //判断链表是否为空
        if (head.next == null){
            StdOut.println("链表为空");
        }
        HeroNode temp = head.next;
        boolean flag = false;//标志有没有要删除的元素，有的话就置为true
        while (true){
            if (temp == null){//遍历完毕
                break;
            }
            if (temp.no == no){//找到要删除的元素
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //删除元素操作
        if (flag){
                temp.pre.next = temp.next;
                if (temp.next != null){//如果删除的不是最后一个节点
                    temp.next.pre = temp.pre;
                }

        }else {
            System.out.printf("找不到no为%d的英雄节点",no);
        }

    }

    //展示链表
    public void show(){
        HeroNode temp = head.next;
        if (temp == null){
            StdOut.println("双向链表为空");
        }
        while (temp != null){
            System.out.println(temp);
            temp = temp.next;
        }
    }

}
